Skip to content

[PM-40252] feat: migrate shared vault components to shared-folder terminology#21967

Open
jaasen-livefront wants to merge 16 commits into
mainfrom
PM-40252
Open

[PM-40252] feat: migrate shared vault components to shared-folder terminology#21967
jaasen-livefront wants to merge 16 commits into
mainfrom
PM-40252

Conversation

@jaasen-livefront

@jaasen-livefront jaasen-livefront commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-40252

📔 Objective

Behind the vfo1-foundation feature flag (off by default), migrate the shared libs/vault components — consumed by web, browser, and desktop — from collection/folder terminology to shared-folder / my-folder terminology, using the vfo1I18n pipe and Vfo1TerminologyService:

  • item-detail card aria labels + titles (item-details-v2)
  • cipher-form labels (item-details-section)
  • new-item menu items + "New/Add" button label (new-cipher-menu)
  • vault batch-bar "Assign to collections" label (vault-batch-action)

Adds the compound shared-folder localization keys to web/browser/desktop (en).

Copy decision: collection* → "shared folder" substitutions apply everywhere; personal-folder action phrases stay "folder" (only the entity noun label flips to "My folder"), so add-edit-folder-dialog and addToFolder are unchanged. Icon swaps and the vault-filter query-param rename are handled in separate tickets (PM-40255, PM-40510).

With the flag off there is no visible change; per-client wiring + QA land in PM-40165 / PM-40253 / PM-40254.

Screen.Recording.2026-07-21.at.12.16.32.PM.mov

…der terminology

Behind the vfo1-foundation flag, migrate shared libs/vault components to
shared-folder / my-folder terminology via the vfo1I18n pipe and
Vfo1TerminologyService: item detail aria/title, cipher-form labels,
new-item menu + button label, vault batch-bar assign label, and the
assign-collections dialog labels + submit toasts. Adds the compound
shared-folder localization keys to web/browser/desktop.

Per copy decision, personal-folder action phrases stay "folder" (only the
entity label flips to "My folder"). Icon swaps and the query-param rename
are handled in separate tickets.
@jaasen-livefront jaasen-livefront added the ai-review Request a Claude code review label Jul 20, 2026
…shared-folder terminology

VaultFilterService.getCollectionFilterHead / getFolderFilterHead now read
Vfo1TerminologyService.enabled() and use the sharedFolders / myFolders i18n
keys (the head node name is rendered via the i18n pipe) when the flag is on,
falling back to collections / folders when off. Updates the desktop provider
deps array (web modules resolve the root service via reflection).
…lder terminology

The desktop cipher-row menu item and assign-collections dialog title now use
the vfo1I18n pipe (assignToCollections -> assignToSharedFolders) when the
vfo1-foundation flag is on. Event-type discriminators are unchanged.
The create-action menu item reads better as "Folder" than "My folder", per
the copy decision that personal-folder action phrases stay "folder". The
Collection item still flips to "Shared folder" under the flag.
…folder terminology

The web cipher-row three-dot menu, bulk-actions menu, and assign-collections
dialog title now use the vfo1I18n pipe (assignToCollections ->
assignToSharedFolders) when the vfo1-foundation flag is on. Vfo1I18nPipe added
to VaultItemsModule and the standalone web dialog component.
Copilot AI review requested due to automatic review settings July 21, 2026 16:50
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

🤖 Bitwarden Claude Code Review

Overall Assessment: APPROVE

This PR migrates shared libs/vault components (item detail, cipher-form, new-item menu, vault filter) from collection/folder to shared-folder/my-folder terminology behind the vfo1-foundation flag (off by default), routing through Vfo1TerminologyService and the impure Vfo1I18nPipe. DI wiring for the shared VaultFilterService was verified across web (override + individual-vault module) and desktop (safeProvider deps updated); browser does not consume it. All new i18n keys (sharedFolder/myFolder/sharedFolders/myFolders/addSharedFolder/newSharedFolder) exist in every consuming app's en locale, and the aria-label separator fix is covered by new unit tests.

Code Review Details
  • ⚠️ : Singular folder field label maps to plural myFolders key; should use singular myFolder
    • libs/vault/src/cipher-form/components/item-details/item-details-section.component.html:58

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared libs/vault UI surfaces (consumed by web/browser/desktop) from collection/folder terminology to shared-folder / my-folder terminology behind the VFO1Foundation feature flag, using Vfo1I18nPipe and Vfo1TerminologyService, and adds the necessary English localization keys in each client.

Changes:

  • Updated vault filter tree head identifiers and multiple vault UI labels/toasts to switch terminology based on Vfo1TerminologyService.enabled().
  • Introduced/expanded usage of Vfo1I18nPipe in templates and added new shared-folder localization keys to web/desktop/browser en.
  • Applied repo-wide formatting improvements (primarily union-type and template literal formatting) across multiple libraries/apps.

Reviewed changes

Copilot reviewed 90 out of 91 changed files in this pull request and generated no comments.

Show a summary per file
File Description
libs/vault/src/services/vault-filter.service.ts Switch filter head names via flag
libs/vault/src/services/vault-filter.service.spec.ts Add tests for head naming
libs/vault/src/models/vault-filter-section.type.ts Union type formatting only
libs/vault/src/components/vault-batch-bar/vault-batch-action.component.ts Flagged i18n key for batch action
libs/vault/src/components/vault-batch-bar/vault-batch-action.component.spec.ts Test flagged batch action label
libs/vault/src/components/new-cipher-menu/new-cipher-menu.component.ts Flagged keys for “new/add” labels
libs/vault/src/components/new-cipher-menu/new-cipher-menu.component.html Use vfo1I18n for menu label
libs/vault/src/components/assign-collections.component.ts Flagged toast/success keys
libs/vault/src/components/assign-collections.component.spec.ts Stabilize ConfigService mock for flag
libs/vault/src/components/assign-collections.component.html Use vfo1I18n for dialog text
libs/vault/src/cipher-view/item-details/item-details-v2.component.ts Flagged aria/title terminology
libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts Add Vfo1I18nPipe import
libs/vault/src/cipher-form/components/item-details/item-details-section.component.html Use vfo1I18n for labels
libs/tools/generator/core/src/types/generator-constraints.ts Union type formatting only
libs/tools/generator/core/src/metadata/type.ts Union type formatting only
libs/tools/generator/core/src/metadata/profile-metadata.ts Union type formatting only
libs/tools/export-vault-core/src/types/bitwarden-json-export-types.ts Union type formatting only
libs/logging-angular/README.md Example formatting only
libs/key-management-ui/src/key-rotation/key-rotation-dialog.component.ts Union/arrow formatting only
libs/importer/src/models/import-options.ts Union type formatting only
libs/importer/src/importers/protonpass/types/protonpass-json-type.ts Union type formatting only
libs/importer/src/importers/enpass/types/enpass-item-templates.ts Union type formatting only
libs/components/src/utils/function-to-observable.ts Union type formatting only
libs/components/src/tooltip/tooltip-positions.ts Union type formatting only
libs/components/src/icon-tile/icon-tile.component.ts Union type formatting only
libs/components/src/berry/berry.component.ts Union type formatting only
libs/common/src/tools/integration/README.md Type example formatting only
libs/common/src/services/api.service.ts Union type formatting only
libs/common/src/key-management/session-timeout/types/session-timeout.type.ts Union type formatting only
libs/common/src/key-management/encrypted-migrator/migrations/encrypted-migration.ts Union type formatting only
libs/common/src/billing/services/subscription-pricing.service.ts Minor map formatting only
libs/common/src/auth/models/response/identity-response.ts Union type formatting only
libs/common/src/admin-console/models/data/encrypted-organization-key.data.ts Union type formatting only
libs/common/src/abstractions/api.service.ts Union type formatting only
libs/auth/src/angular/user-verification/user-verification-form-input.component.ts Union type formatting only
libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts Union type formatting only
libs/auth/src/angular/sso/sso-component.service.ts Union type formatting only
libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.ts Union type formatting only
libs/auth/src/angular/input-password/input-password.component.ts Union type formatting only
bitwarden_license/bit-web/src/app/billing/providers/warnings/types/provider-warnings.ts Union type formatting only
bitwarden_license/bit-common/src/dirt/reports/risk-insights/services/domain/risk-insights-report.service.ts Minor map formatting only
apps/web/src/locales/en/messages.json Add shared-folder localization keys
apps/web/src/app/vault/components/vault-items/vault-items.module.ts Import Vfo1I18nPipe
apps/web/src/app/vault/components/vault-items/vault-items.component.html Use vfo1I18n for assign label
apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html Use vfo1I18n for assign label
apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.ts Add Vfo1I18nPipe to imports
apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.html Use vfo1I18n in dialog title
apps/web/src/app/tools/send/send.component.ts Union type formatting only
apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.ts Union type formatting only
apps/web/src/app/billing/payment/components/edit-billing-address-dialog.component.ts Union type formatting only
apps/web/src/app/billing/organizations/change-plan-dialog.component.ts Conditional formatting only
apps/web/src/app/auth/settings/webauthn-login-settings/create-credential-dialog/create-credential-dialog.component.ts Union type formatting only
apps/web/src/app/auth/settings/two-factor/two-factor-setup-duo.component.ts Union type formatting only
apps/web/src/app/admin-console/organizations/collections/vault-filter/vault-filter.service.ts Pass terminology service to base
apps/desktop/src/vault/app/vault/assign-collections/assign-collections-desktop.component.ts Add Vfo1I18nPipe to imports
apps/desktop/src/vault/app/vault/assign-collections/assign-collections-desktop.component.html Use vfo1I18n in dialog title
apps/desktop/src/vault/app/vault-v3/vault-items/vault-item-event.ts Union type formatting only
apps/desktop/src/vault/app/vault-v3/vault-items/vault-cipher-row.component.ts Add Vfo1I18nPipe to imports
apps/desktop/src/vault/app/vault-v3/vault-items/vault-cipher-row.component.html Use vfo1I18n for assign label
apps/desktop/src/locales/en/messages.json Add shared-folder localization keys
apps/desktop/src/app/services/services.module.ts Ensure terminology service provided
apps/desktop/native-messaging-test-runner/src/native-message.service.ts Union type formatting only
apps/cli/src/tools/send/commands/create.command.ts Union type formatting only
apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts Map formatting only
apps/browser/src/platform/utils/web-ext-sender.ts Union type formatting only
apps/browser/src/background/main.background.ts switchMap formatting only
apps/browser/src/autofill/types/index.ts Union type formatting only
apps/browser/src/autofill/overlay/inline-menu/abstractions/autofill-inline-menu-page-element.ts Union type formatting only
apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts Comment/union formatting only
apps/browser/src/autofill/fido2/content/messaging/messenger.ts Union type formatting only
apps/browser/src/autofill/fido2/content/fido2-content-script.ts Union type formatting only
apps/browser/src/autofill/fido2/content/fido2-content-script.spec.ts Union type formatting only
apps/browser/src/autofill/content/components/option-selection/option-selection.ts Template formatting only
apps/browser/src/autofill/content/components/option-selection/option-items.ts Template formatting only
apps/browser/src/autofill/content/components/notification/header.ts Template formatting only
apps/browser/src/autofill/content/components/notification/footer.ts Template formatting only
apps/browser/src/autofill/content/components/notification/container.ts Template formatting only
apps/browser/src/autofill/content/components/notification/confirmation/message.ts Template formatting only
apps/browser/src/autofill/content/components/notification/confirmation/container.ts Template formatting only
apps/browser/src/autofill/content/components/notification/confirmation/body.ts Template formatting only
apps/browser/src/autofill/content/components/notification/at-risk-password/message.ts Template formatting only
apps/browser/src/autofill/content/components/notification/at-risk-password/container.ts Template formatting only
apps/browser/src/autofill/content/components/notification/at-risk-password/body.ts Template formatting only
apps/browser/src/autofill/content/components/inline-menu/prompt.ts Template formatting only
apps/browser/src/autofill/content/components/cipher/cipher-info.ts Template formatting only
apps/browser/src/autofill/content/components/buttons/option-selection-button.ts Template formatting only
apps/browser/src/autofill/content/components/buttons/edit-button.ts Template formatting only
apps/browser/src/autofill/content/components/buttons/badge-button.ts Template formatting only
apps/browser/src/autofill/content/components/buttons/action-button.ts Template formatting only
apps/browser/src/_locales/en/messages.json Add shared-folder localization keys
.claude/skills/figma-to-angular/SKILL.md Example formatting only

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copilot AI review requested due to automatic review settings July 21, 2026 16:57
@bitwarden bitwarden deleted a comment from github-actions Bot Jul 21, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 27 changed files in this pull request and generated 3 comments.

Comment thread apps/browser/src/autofill/content/components/notification/confirmation/message.ts Outdated
Comment thread apps/browser/src/autofill/content/components/notification/confirmation/message.ts Outdated
Comment thread libs/vault/src/components/assign-collections.component.ts Outdated
@codecov

codecov Bot commented Jul 21, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 69.23077% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 52.32%. Comparing base (2f74a0f) to head (e9de5d7).
⚠️ Report is 38 commits behind head on main.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...her-view/item-details/item-details-v2.component.ts 60.00% 2 Missing and 2 partials ⚠️
...nents/new-cipher-menu/new-cipher-menu.component.ts 42.85% 4 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #21967      +/-   ##
==========================================
+ Coverage   52.10%   52.32%   +0.21%     
==========================================
  Files        4122     4171      +49     
  Lines      130348   132103    +1755     
  Branches    20463    20779     +316     
==========================================
+ Hits        67922    69122    +1200     
- Misses      57407    57915     +508     
- Partials     5019     5066      +47     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jaasen-livefront jaasen-livefront added the t:feature Change Type - Feature Development label Jul 21, 2026
Copilot AI review requested due to automatic review settings July 21, 2026 19:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 27 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings July 21, 2026 19:40
@jaasen-livefront
jaasen-livefront marked this pull request as ready for review July 21, 2026 19:45
@jaasen-livefront
jaasen-livefront requested review from a team as code owners July 21, 2026 19:45
@jaasen-livefront

jaasen-livefront commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

Want to make sure we aren't changing i18n copy twice (once for org => vault and another for collection => shared folder)/getting those changes QAed twice, so I pulled the assign-collection dialog to PM-40119. Design changed some of the wording in that dialog.

@jengstrom-bw Thanks for pointing these out. I reverted these changes.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 1 comment.

Comment thread libs/vault/src/cipher-view/item-details/item-details-v2.component.ts Outdated
Copilot AI review requested due to automatic review settings July 21, 2026 21:35

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (1)

libs/vault/src/cipher-view/item-details/item-details-v2.component.ts:103

  • aria-label is built by concatenating the translated type label and the item name without any separator. Since the visible name is marked aria-hidden, screen readers will announce e.g. "Shared folderMy Team". Add a separator (at least a space) between the translated label and item.name.
  getAriaLabel(item: Organization | CollectionView | FolderView): string {
    if (item instanceof Organization) {
      return this.i18nService.t("owner") + item.name;
    } else if (item instanceof CollectionView) {
      return (

Comment thread libs/vault/src/components/vault-batch-bar/vault-batch-action.component.ts Outdated
Comment thread libs/vault/src/components/vault-batch-bar/vault-batch-action.component.ts Outdated

@jengstrom-bw jengstrom-bw left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

couple little cleanup things from the removal of assign-collections, but otherwise looks good!

Copilot AI review requested due to automatic review settings July 22, 2026 16:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

libs/vault/src/cipher-view/item-details/item-details-v2.component.ts:108

  • getAriaLabel concatenates the translated label and the item name without any separator, producing values like "OwnerAcme" / "Shared folderTeam" for screen readers. Add a space (or other separator) between the label and item.name for all branches.
  getAriaLabel(item: Organization | CollectionView | FolderView): string {
    if (item instanceof Organization) {
      return this.i18nService.t("owner") + item.name;
    } else if (item instanceof CollectionView) {
      return (
        this.i18nService.t(this.terminology.enabled() ? "sharedFolder" : "collection") + item.name
      );
    } else if (item instanceof FolderView) {
      return this.i18nService.t(this.terminology.enabled() ? "myFolder" : "folder") + item.name;
    }

@jaasen-livefront

Copy link
Copy Markdown
Collaborator Author

@jengstrom-bw Thanks for the review! Ready for another look when you have a chance.

jengstrom-bw
jengstrom-bw previously approved these changes Jul 22, 2026

@jengstrom-bw jengstrom-bw left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Thanks Jordan!

@jaasen-livefront

Copy link
Copy Markdown
Collaborator Author

@jengstrom-bw just pushed a small fix to address this issue

jengstrom-bw
jengstrom-bw previously approved these changes Jul 22, 2026
JaredScar
JaredScar previously approved these changes Jul 22, 2026
@jaasen-livefront
jaasen-livefront dismissed stale reviews from JaredScar and jengstrom-bw via e9de5d7 July 23, 2026 20:15
@jaasen-livefront

Copy link
Copy Markdown
Collaborator Author

@JaredScar @jengstrom-bw Just pushed a couple small fixes as per design review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review Request a Claude code review t:feature Change Type - Feature Development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants